import requests
import json
import time
from typing import List, Dict
import itertools

# DeepSeek API配置
API_KEY = "sk-c06e2d97acc34042b64bb38806f7931e"
API_URL = "https://api.deepseek.com/v1/chat/completions"  # 请确认这是正确的API端点

# 场景和维度定义
SCENARIOS = [
    "场地氛围", "寒暄破冰", "微表情捕捉", "抗拒信号", "数据展示时机",
    "团队故事", "价值主张", "行程节奏", "参观引导", "餐桌微动作",
    "需求暗线", "让步表情", "收尾信号", "估值攻防", "风险质疑",
    "条款表情", "愿景共鸣", "权责试探", "信任信号", "供应商评估",
    "价格谈判", "合同博弈"  # 新增的2个场景
]

DIMENSIONS = ["微表情识别", "身体语言解读", "语音语调分析",
              "语境与背景理解", "情感感知", "意图推断", "文化敏感性",
              "权力动态分析", "诚信度评估", "压力管理", "融洽关系建立",
              "说服技巧识别", "冲突检测与解决", "积极倾听应用", "决策信号识别"]

# 提示词模板
PROMPT_TEMPLATE = """
你是一位资深的商业教练和人力资源专家，擅长沟通、谈判和情绪智能（EQ）培训。你的任务是创建用于训练"商业察言观色能力"的练习题。

请根据以下要求生成一道题目：

1. 核心场景：{scenario}
2. 能力维度：{dimension}
3. 题目形式：单选题
4. 题目结构：
   - 情境描述 (2-3句话)：清晰地描述一个具体的商业场景、人物关系和当前对话状态。
   - 关键观察点 (1-2句话)：描述对方一个或多个具体的非语言行为或语言特征。
   - 问题：基于这个观察，提问这意味着什么或接下来最好怎么做。
   - 选项：提供4个选项（A-D），其中只有1个是最合理、最专业的解读或行动建议。其他3个选项要具有迷惑性，是常见的错误解读或反应。
   - 答案与解析：明确指出正确答案（例如：B），并用2-3句话详细解释为什么这个选项正确，以及其他选项为什么错误或不佳。

请开始生成题目，严格遵循上述结构。
"""


def generate_question(scenario: str, dimension: str) -> Dict:
    """使用DeepSeek API生成单个题目"""

    # 构建提示词
    prompt = PROMPT_TEMPLATE.format(scenario=scenario, dimension=dimension)

    # API请求头
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }

    # API请求数据
    data = {
        "model": "deepseek-chat",  # 使用DeepSeek的最佳模型
        "messages": [
            {"role": "system", "content": "你是一位专业的商业培训师，专注于情商和商业沟通技能的培养。"},
            {"role": "user", "content": prompt}
        ],
        "temperature": 0.7,  # 控制创造性，0.7在专业性和多样性间取得平衡
        "max_tokens": 1500,  # 确保有足够长度生成完整题目
        "top_p": 0.9,  # 核采样参数，控制多样性
        "frequency_penalty": 0.2,  # 减少重复内容
        "presence_penalty": 0.1  # 鼓励新话题
    }

    try:
        # 发送API请求
        response = requests.post(API_URL, headers=headers, json=data, timeout=30)
        response.raise_for_status()  # 检查HTTP错误

        result = response.json()
        answer = result['choices'][0]['message']['content']

        return {
            "scenario": scenario,
            "dimension": dimension,
            "question": answer,
            "success": True
        }

    except Exception as e:
        print(f"生成题目时出错 (场景: {scenario}, 维度: {dimension}): {str(e)}")
        return {
            "scenario": scenario,
            "dimension": dimension,
            "question": f"生成失败: {str(e)}",
            "success": False
        }


def generate_questions(num_questions: int = 330) -> List[Dict]:
    """生成指定数量的题目"""

    questions = []
    
    # 生成所有可能的场景-维度组合
    all_combinations = list(itertools.product(SCENARIOS, DIMENSIONS))
    
    # 确保生成指定数量的题目（最多为所有组合的数量）
    num_questions = min(num_questions, len(all_combinations))

    # 按顺序使用场景-维度组合
    for i in range(num_questions):
        scenario, dimension = all_combinations[i]
        
        print(f"正在生成题目 {i + 1}/{num_questions}: {scenario} - {dimension}")

        # 生成题目
        question = generate_question(scenario, dimension)
        questions.append(question)

        # 添加延迟以避免API限制
        time.sleep(1)

    return questions


def save_questions(questions: List[Dict], filename: str = "business_observation_questions.json"):
    """保存题目到JSON文件"""

    # 计算成功率
    success_count = sum(1 for q in questions if q['success'])

    # 准备保存的数据
    data = {
        "metadata": {
            "total_generated": len(questions),
            "successful": success_count,
            "success_rate": f"{(success_count / len(questions)) * 100:.1f}%",
            "generated_at": time.strftime("%Y-%m-%d %H:%M:%S")
        },
        "questions": questions
    }

    # 保存到文件
    with open(filename, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

    print(f"已保存 {len(questions)} 道题目到 {filename}")
    print(f"成功率: {data['metadata']['success_rate']}")


if __name__ == "__main__":
    print("开始生成商业场景察言观色能力题目...")

    # 生成330道题目
    questions = generate_questions(330)

    # 保存题目
    save_questions(questions)

    # 打印一些统计信息
    successful_questions = [q for q in questions if q['success']]
    print(f"\n成功生成 {len(successful_questions)} 道题目:")

    for i, q in enumerate(successful_questions[:3], 1):  # 显示前3道题目作为示例
        print(f"\n示例题目 {i}:")
        print(f"场景: {q['scenario']}")
        print(f"维度: {q['dimension']}")
        print("内容:")
        print(q['question'])
        print("-" * 50)